using Godot;
using System;
using Smr.基类;
using Smr;
using Smr.枚举;
using Smr.索引;

public partial class 组件道具 : Control
{
    [Signal] public delegate void 信号被点击EventHandler(组件道具 道具);
    [Export] private Label 容器标签;
    [Export] private Label 标识一标签;
    [Export] private Label 标识二标签;
    [Export] private PackedScene 道具介绍场景;
    [Export] private PackedScene 装备介绍场景;
    [Export] private PackedScene 拆分石介绍场景;

    private C道具模型 道具 = null;
    private C宠物模型 宠物 = null;
    private E道具位置 位置;
    private StyleBoxFlat 默认容器标签样式;

    public override void _Ready()
    {
        // 如果多个实例 样式必须用 Duplicate 复制新资源
        默认容器标签样式 = (StyleBoxFlat)容器标签.GetThemeStylebox("normal").Duplicate(true);
        GuiInput += 鼠标点击事件;
    }

    public void 置道具(C道具模型 待添加道具, E道具位置 待添加位置)
    {
        道具 = 待添加道具;
        位置 = 待添加位置;

        if (道具 == null)
        {
            QueueFree();
            return;
        }
        if (道具.当前数量 > 1)
        {
            标识一标签.Text = 道具.当前数量.ToString();
        }
        else if (位置 == E道具位置.装备拆分)
        {
            标识一标签.Text = 道具.当前数量.ToString();
        }
        else
        {
            标识一标签.Text = "";
        }
        容器标签.Text = 道具.名称;
        // 获取标签盒子样式
        StyleBoxFlat 当前标签样式 = (StyleBoxFlat)容器标签.GetThemeStylebox("normal").Duplicate(true);

        // 判断背包道具类型, 并设置常用属性
        if (道具.类型 == E道具类型.装备)
        {
            C装备模型 装备 = (C装备模型)道具;
            if (装备.附加属性.Count > 0)
            {
                当前标签样式.BgColor = new Color(配置.道具品级颜色[(int)E道具品级.中级]);
            }
            else
            {
                当前标签样式.BgColor = new Color("#f0f0f0");
            }
            标识一标签.Text = 装备.称谓要求.ToString();
        }
        else
        {
            if (道具.背景颜色 != "")
            {
                当前标签样式.BgColor = new Color(道具.背景颜色);
            }
            else
            {
                当前标签样式.BgColor = new Color(配置.道具品级颜色[(int)道具.品级]);
            }
        }

        // 判断道具是否为特殊道具, 可未其设置独有属性
        if (道具.类型 == E道具类型.消耗 && (位置 == E道具位置.背包 || 位置 == E道具位置.装备重组) && 道具.索引 == (int)E道具索引.拆分石)
        {
            C装备模型 拆分石 = (C装备模型)道具;
            if (拆分石.附加属性.Count > 0)
            {
                标识一标签.Text = 拆分石.称谓要求.ToString();
                标识二标签.Text = 拆分石.部位 + "·" + 拆分石.附加属性[0].属性名;
                标识二标签.Visible = true;
            }
        }

        // 设置标签盒子样式
        容器标签.AddThemeStyleboxOverride("normal", 当前标签样式);
    }

    public C道具模型 取道具()
    {
        return 道具;
    }

    public void 置道具当前数量(int 数量)
    {
        道具.当前数量 = 数量;
        if (道具.当前数量 > 1)
        {
            标识一标签.Text = 道具.当前数量.ToString();
        }
        else if (位置 == E道具位置.装备拆分)
        {
            标识一标签.Text = 道具.当前数量.ToString();
        }
        else
        {
            标识一标签.Text = "";
        }
    }

    public void 置宠物(C宠物模型 待添加宠物)
    {
        宠物 = 待添加宠物;

        if (宠物 == null)
        {
            QueueFree();
            return;
        }
        容器标签.Text = 宠物.基础属性.名称;
        标识一标签.Text = "";
        标识二标签.Text = $"{宠物.基础属性.称谓}·{宠物.基础属性.职级}";
    }

    public C宠物模型 取宠物()
    {
        return 宠物;
    }

    public void 清空组件()
    {
        道具 = null;
        宠物 = null;
        容器标签.Text = "";
        标识一标签.Text = "";
        标识二标签.Text = "";
        容器标签.AddThemeStyleboxOverride("normal", 默认容器标签样式);
    }

    private void 鼠标点击事件(InputEvent @event)
    {
        if (@event is InputEventMouseButton mouseEvent)
        {
            if (mouseEvent.ButtonIndex == MouseButton.Left && mouseEvent.Pressed)
            {
                if (道具 == null)
                {
                    EmitSignal(SignalName.信号被点击, this);
                    return;
                }
                Node 介绍实例 = null;
                // 判断道具类型
                if (道具.类型 == E道具类型.装备 && (位置 == E道具位置.背包 || 位置 == E道具位置.装备栏))
                {
                    介绍实例 = 装备介绍场景.Instantiate<弹窗装备介绍>();
                }
                else if (道具.索引 == (int)E道具索引.拆分石 && 位置 == E道具位置.背包)
                {
                    介绍实例 = 拆分石介绍场景.Instantiate<弹窗拆分石介绍>();
                }
                else if (道具.类型 != E道具类型.装备 && 位置 == E道具位置.背包)
                {
                    介绍实例 = 道具介绍场景.Instantiate<弹窗道具介绍>();
                }
                else
                {
                    EmitSignal(SignalName.信号被点击, this);
                }
                // 多个类继承同一个类 包括有相同方法
                if (介绍实例 != null && 介绍实例 is 弹窗道具介绍继承 介绍接口)
                {
                    介绍接口.置弹窗介绍内容(道具);
                    游戏管理.舞台实例.置弹窗(介绍实例, 取组件位置());
                }
            }
        }
    }

    private Vector2I 取组件位置()
    {
        return new Vector2I((int)(GlobalPosition.X + Size.X / 2), (int)(GlobalPosition.Y + Size.Y / 2));
    }
}
